<?php
declare (strict_types = 1);

namespace app\util;

use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\Writer\PngWriter;

/**
 * 二维码生成工具类
 */
class QrCode
{
    /**
     * 获取二维码图片的保存目录
     * 
     * @return string
     */
    protected static function getQrCodeDir()
    {
        $dir = public_path() . 'uploads/qrcodes/';
        if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
        }
        return $dir;
    }
    
    /**
     * 生成二维码图片URL（使用api.qrserver.com）
     *
     * @param string $content 二维码内容
     * @param int $size 尺寸，默认200
     * @return string 图片URL
     */
    public static function generateApiUrl($content, $size = 200)
    {
        // 使用在线二维码生成服务
        $content = urlencode($content);
        return "https://api.qrserver.com/v1/create-qr-code/?size={$size}x{$size}&data={$content}";
    }
    
    /**
     * 生成并保存二维码到本地
     *
     * @param string $content 二维码内容
     * @param int $size 尺寸，默认200
     * @return string 图片相对路径
     */
    public static function generateImage($content, $size = 300)
    {
        // 生成唯一文件名
        $filename = md5($content . microtime()) . '.png';
        $dir = self::getQrCodeDir();
        $filepath = $dir . $filename;
        
        // 使用Endroid库生成二维码
        $result = Builder::create()
            ->writer(new PngWriter())
            ->writerOptions([])
            ->data($content)
            ->encoding(new Encoding('UTF-8'))
            ->errorCorrectionLevel(new ErrorCorrectionLevelHigh())
            ->size($size)
            ->margin(10)
            ->build();
            
        // 保存到文件
        file_put_contents($filepath, $result->getString());
        
        // 返回相对路径
        return '/uploads/qrcodes/' . $filename;
    }
    
    /**
     * 生成二维码图片URL
     *
     * @param string $content 二维码内容
     * @param int $size 尺寸，默认200
     * @return string 图片URL
     */
    public static function generateUrl($content, $size = 200)
    {
        // 生成本地二维码图片并返回URL
        $relativePath = self::generateImage($content, $size);
        return request()->domain() . $relativePath;
    }
    
    /**
     * 生成用户邀请链接
     *
     * @param int $userId 用户ID
     * @param string $baseUrl 前端基础地址
     * @return string 邀请链接
     */
    public static function generateInviteUrl($userId, $baseUrl)
    {
        // 确保baseUrl末尾没有斜杠
        $baseUrl = rtrim($baseUrl, '/');
        
        // 生成邀请链接
        return "{$baseUrl}/?invite_code={$userId}";
    }
    
    /**
     * 生成用户邀请二维码URL
     *
     * @param int $userId 用户ID
     * @param string $baseUrl 前端基础地址
     * @param int $size 尺寸，默认200
     * @return string 二维码图片URL
     */
    public static function generateInviteQrUrl($userId, $baseUrl, $size = 200)
    {
        $inviteUrl = self::generateInviteUrl($userId, $baseUrl);
        return self::generateUrl($inviteUrl, $size);
    }
} 